/*
 * @描述:
 * @作者: 约訂
 * @Date: 2023-06-07 17:28:51
 * @LastEditTime: 2024-11-25 10:08:46
 * @修改人员: 约訂
 */
import axios, { AxiosResponse, AxiosRequestConfig } from "axios";
import { ElMessage } from "element-plus";
/**路由 */
// import { useRouter } from 'vue-router';
// const router = useRouter();
import router from "@/router";
const ShowMessage = function (val: object): void {
  ElMessage.closeAll();
  ElMessage(val);
};
/**线上环境 */
// axios.defaults.baseURL = 'https://kefu.xigyu.com/service';
axios.defaults.baseURL = "https://wechatyweb.xigyu.com/service";
// axios.defaults.baseURL = "https://newapi.xigyu.com/";
// axios.defaults.baseURL = 'http://192.168.0.21:6589';
// axios.defaults.baseURL = 'https://632cz72258.zicp.fun/';
// axios.defaults.baseURL = 'http://192.168.0.91:1234';
// axios.defaults.baseURL = "http://192.168.0.91:60099";
// axios.defaults.baseURL = 'http://192.168.0.50:8098';
// axios.defaults.baseURL = 'http://192.168.0.50:8099';
// axios.defaults.timeout = 5000;
// // 允许跨域
axios.defaults.withCredentials = false;
// // Content-Type 响应头
// axios.defaults.headers.post['Content-Type'] = '["application/x-www-form-urlencoded;charset=UTF-8"]';
// // axios.defaults.headers.post['Access-Control-Request-Method'] = 'GET,POST';
// axios.defaults.headers.post['Access-Control-Allow-Origin'] = '*';
// axios.defaults.headers.post['Access-Control-Allow-Methods'] = '*';
/**
 *
 * @description 函数返回唯一的请求key **/
function getRequestKey(config: any) {
  let { method, url, params, data } = config;
  // axios中取消请求及阻止重复请求的方法
  // 参数相同时阻止重复请求：
  // return [method, url, JSON.stringify(params), JSON.stringify(data)].join("&");
  // 请求方法相同，参数不同时阻止重复请求
  return [method, url].join("&");
}
/**
 * @description 添加请求信息 **/
let pendingRequest = new Map();
function addPendingRequest(config: any) {
  let requestKey = getRequestKey(config);
  config.cancelToken =
    config.cancelToken ||
    new axios.CancelToken((cancel) => {
      if (!pendingRequest.has(requestKey)) {
        pendingRequest.set(requestKey, cancel);
      }
    });
}
/**
 * @description 取消重复请求 **/
function removePendingRequest(config: any) {
  let requestKey = getRequestKey(config);
  if (pendingRequest.has(requestKey) && !config.headers["X-Skip-Interceptor"]) {
    // 如果是重复的请求，则执行对应的cancel函数
    let cancel = pendingRequest.get(requestKey);
    cancel(requestKey);
    // 将前一次重复的请求移除
    pendingRequest.delete(requestKey);
  }
}
// 基础url
// axios.defaults.baseURL = 后台接口地址;
const service = axios.create();
interface YXRequestConfig extends AxiosRequestConfig {
  headers?: any;
}
// 请求拦截器
service.interceptors.request.use(
  (config: YXRequestConfig) => {
    // 检查是否存在重复请求，若存在则取消已发的请求
    removePendingRequest(config);
    // delete config.headers['X-Skip-Interceptor'];
    // 把当前请求信息添加到pendingRequest对象中
    addPendingRequest(config);
    // console.log(config);

    // const token = localStorage.getItem('token');
    // if (token) {
    //     config.headers.adminAuthorization = token;
    // }
    return config;
  },
  (error: any) => {
    Promise.reject(error);
  }
);

// 响应拦截器
service.interceptors.response.use(
  async (response: AxiosResponse) => {
    // 对响应数据做点什么
    removePendingRequest(response.config);
    if (response.data.code == 401) {
      ShowMessage({
        message: "登录失效，请重新登陆",
        type: "error",
      });
      router.push("/login");
    }
    // 兼容返回文件为 Blob 格式不显示错误提示
    if (
      !response.data.Success &&
      !(response.data instanceof Blob) &&
      !(response.data.code == 0)
    ) {
      ShowMessage({
        message: response.data.msg,
        type: "error",
      });
    }
    // /**操作错误提示 */
    // if (response.data.code == 400) {
    //     ShowMessage({
    //         message: response.data.data,
    //         type: 'error'
    //     });
    // } else if (response.data.code == 401) {
    //     ShowMessage({
    //         message: '登录过期，请重新登录',
    //         type: 'error'
    //     });
    //     router.push('/login');
    // } else if (response.data.code == 500) {
    //     ShowMessage({
    //         message: '请求参数异常',
    //         type: 'error'
    //     });
    //     router.push('/');
    // }
    return response.data;
  },
  (error: any) => {
    removePendingRequest(error.config || {});
    if (axios.isCancel(error)) {
      console.log("被取消的重复请求：" + error.message);
    }
    if (error.response?.status == 401) {
      ShowMessage({
        message: "登录过期，请重新登录",
        type: "error",
      });
      localStorage.removeItem("token");
      router.push("/login");
    }
    // else if (error.response.data.code == 500) {
    //     ShowMessage({
    //         message: '请求参数异常',
    //         type: 'error'
    //     });
    //     router.push('/');
    // }
    return Promise.reject(error);
  }
);

export default service;
